package com.mall.rabbitmq.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class RabbitMQConfig {

    // 普通交换机名称
    public static final String EXCHANGE_NAME = "item_topic_exchange";

    // 普通队列名称
    public static final String QUEUE_NAME = "item_queue";

    // 死信队列名称
    public static final String B_QUEUE_NAME = "xkp_queue";


    /***
     * 声明交换机
     */
    @Bean(name = "itemTopicExchange")
    public Exchange topicExchange(){
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }

    /***
     * 声明队列
     */
    @Bean(name = "itemQueue")
    public Queue itemQueue(){
        /**
         * 1.队列创建后 对应的元素是无法修改的
         * 2.超时的消息会分发到死信队列中
         * 3.若发出的消息超出最大存储消息数量 则会保留后面的几条在队列中 前面的消息会被移动到死信队列中
         */

        // 创建map集合：封装队列参数
        Map<String,Object> map = new HashMap<>();
        // 绑定死信交换机名称
        map.put("x-dead-letter-exchange", EXCHANGE_NAME);
        // 设置发送给死信交换机的routingKey
        map.put("x-dead-letter-routing-key", "xkp.news");
        // 设置队列过期时间毫秒 未接收就会超时
        map.put("x-message-ttl", 30000);
        // 设置队列可以存储的最大消息数量
        map.put("x-max-length", 10);
        return new Queue(QUEUE_NAME, true, false, false, map);
    }

    /***
     * 队列绑定到交换机上
     */
    @Bean
    public Binding itemQueueExchange(@Qualifier("itemQueue")Queue queue,
                                     @Qualifier("itemTopicExchange")Exchange exchange){
        //绑定时添加了key 用的是topic模式 也就是可以用通配符
        return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
    }

    /***
     * 定义死信队列
     */
    @Bean("xkpQueue")
    public Queue createDeadQueue(){
        return QueueBuilder.durable(B_QUEUE_NAME).build();
    }

    /***
     * 死信队列绑定到交换机上
     */
    @Bean
    public Binding xkpQueueExchange(@Qualifier("xkpQueue")Queue queue,
                                     @Qualifier("itemTopicExchange")Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("xkp.#").noargs();
    }

}